#include "Clientdatacenter.h"
#include "Clientsqlite3.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <openssl/sha.h>
#include "../GlobalMessage.h"// 全局消息定义文件

#define DBPath "./clientchatroom.db"// 数据库文件路径常量 DBPath

static SQL *s;// 静态的数据库句柄

//执行数据库的初始化，并创建客户端本地消息表
bool DataCenterInit()
{
    s = StdSqlite3Init(DBPath);// 初始化数据库连接
    printf("数据库连接成功\n");
    if(s == NULL)
    {
        return false;
    }
    // 创建表
    char messages[]="create table if not exists messages(sendname text,recvname text,content text,timestamp DATETIME DEFAULT CURRENT_TIMESTAMP);";
    return SQLExec(s,messages);// 执行SQL语句，返回执行结果
}

// 用于插入消息到数据库
bool ClientInterMessage(MSG *m)
{
    char sql[1024] = {0};
    char content[256] = {0};// 内容字符串
    // 拷贝消息内容
    strcpy(content,m->Content);
    sprintf(sql,"insert into messages (sendname,recvname,content) values('%s','%s','%s');",m->FromName,m->ToName,content);
    return SQLExec(s,sql);
}

//删除本地数据库中的消息
bool DeleteMessage(MSG *m)
{
    char connect[50] = {0};
    char sql[1024] = {0};
    strcpy(connect,m->Content);
    sprintf(sql,"delete  from messages where sendname = '%s' and recvname = '%s' and content = '%s';",m->FromName,m->ToName,connect);
    return SQLExec(s,sql);
}

// 获取指定发送者和接收者之间的消息，并返回实际获取的消息数量
/*
    MSG messages[] 是一个 MSG 结构体数组，用于存储获取的消息。
    const char *sendname 是发送者的名字。
    const char *recvname 是接收者的名字。
    int size 是消息数组的大小。
*/
int GetMessages(MSG messages[],const char *sendname,const char *recvname,int size)
{
    printf("进入获取数据库函数\n");
    char sql[1024] = {0};
    // 获取双方之间的所有聊天记录，不论是谁发送的消息
    // 结果按照 timestamp 列进行升序排序
    sprintf(sql,"select * from messages where (sendname = '%s' and recvname = '%s') or (sendname = '%s' and recvname = '%s') ORDER BY timestamp ASC;",sendname,recvname,recvname,sendname);
    int row = 0;
    int column = 0;
    int count = 0;
    char **result = GetTableInfo(s,sql,&row,&column);// 获取结果
    // 处理从数据库查询到的消息记录，并将它们填充到 messages 数组中
    if (row <= size)//如果 结果行数小于等于请求获取的消息数量
    {
        for (int i = 1; i <= row; i++)// 遍历从第1行到第 row 行的查询结果
        {
            strcpy(messages[count].FromName,result[i*column]);// 拷贝发送者名称
            strcpy(messages[count].ToName,result[i*column+1]);// 拷贝接收者名称
            strcpy(messages[count].Content+80,result[i*column+2]);// 拷贝消息内容
            strcpy(messages[count].Content,result[i*column+3]);// 拷贝消息时间
            count++;// 计数
        }
    }
    else// 如果 结果行数 大于请求大小
    {
        for (int i = row -size + 1; i <= row; i++)// 从结果中取出最后的 size 条记录，忽略较早的记录
        {
            strcpy(messages[count].FromName,result[i*column]);
            strcpy(messages[count].ToName,result[i*column+1]);
            strcpy(messages[count].Content+80,result[i*column+2]);
            strcpy(messages[count].Content,result[i*column+3]);
            count++;
        }
        
    }
    // 可以确保 messages 数组中包含的是最新的 size 条聊天记录
    FreeTableInfo(result);// 释放查询结果内存
    return count;// 返回获取的消息数目
}


// 获取指定发送者和接收者之间的组消息，并返回实际获取的消息数量
int GetMessagesGroup(MSG messages[],const char *sendname,const char *recvname,int size)
{
    printf("进入获取数据库函数\n");
    char sql[1024] = {0};
    sprintf(sql,"select * from messages where  recvname = '%s' ORDER BY timestamp ASC;",recvname);// 结果按照 timestamp 列进行升序排序
    int row = 0;
    int column = 0;
    int count = 0;
    char **result = GetTableInfo(s,sql,&row,&column);
    if (row <= size)//
    {
        for (int i = 1; i <= row; i++)
        {
            strcpy(messages[count].FromName,result[i*column]);
            strcpy(messages[count].ToName,result[i*column+1]);
            strcpy(messages[count].Content+80,result[i*column+2]);
            strcpy(messages[count].Content,result[i*column+3]);
            count++;
        }
    }
    else
    {
        for (int i = row - size + 1; i <= row; i++)
        {
            strcpy(messages[count].FromName,result[i*column]);
            strcpy(messages[count].ToName,result[i*column+1]);
            strcpy(messages[count].Content+80,result[i*column+2]);
            strcpy(messages[count].Content,result[i*column+3]);
            count++;
        }
        
    }
    FreeTableInfo(result);// 释放查询结果内存
    return count;
}